home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 79 / maccd 79.iso / multimedial / GL Tron / Source / gltron / record.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-13  |  2.9 KB  |  123 lines  |  [TEXT/CWIE]

  1. #include "gltron.h"
  2.  
  3. int startPlaying(char *filename) {
  4.   /*
  5.   char *path;
  6.   
  7.   path = getFullPath(filename);
  8.   if(path != NULL) {
  9.     if((game2->play = fopen(path, "rb")) == NULL) {
  10.       fprintf(stderr, 
  11.           "[playing] can't open file %s for reading\n", filename);
  12.     }
  13.     fprintf(stderr, "starting demo playback\n");
  14.     free(path);
  15.   } else {
  16.     fprintf(stderr, "[playing] no demo file %s available\n", filename);
  17.   }
  18.   */
  19.  
  20.   if((game2->play = fopen(filename, "rb")) == NULL) {
  21.     fprintf(stderr, "[playing] no demo file %s available\n", filename);
  22.     return 1;
  23.   }
  24.   return 0;
  25. }
  26.  
  27. void stopRecording() {
  28.   fclose(game2->record);
  29. }
  30.  
  31. void writeEvent(GameEvent* e) {
  32.   if(fprintf(game2->record, "%d %d %d %d %d\n", e->type, e->player, 
  33.          e->x, e->y, e->timestamp) == 0) {
  34.     fprintf(stderr, "[recording] couldn't write to file\n");
  35.   }
  36. }
  37.  
  38. int startRecording(char *filename) {
  39.   fprintf(stderr, "starting demo recording\n");
  40.   if((game2->record = fopen(filename, "wb")) == NULL) {
  41.       fprintf(stderr, "[recording] can't open file %s for writing\n", 
  42.           filename);    
  43.       return 1;
  44.   }
  45.   return 0;
  46. }
  47.  
  48. void stopPlaying() {
  49.   fclose(game2->play);
  50. }
  51.  
  52. GameEvent* readEvent() {
  53.   GameEvent *e;
  54.   e = (GameEvent*) malloc(sizeof(GameEvent));
  55.   if(fscanf(game2->play, "%d %d %d %d %d ", &(e->type), &(e->player),
  56.         &(e->x), &(e->y), &(e->timestamp)) != 5) {
  57.     free(e);
  58.     return NULL;
  59.   }
  60.   return e;
  61. }
  62.  
  63. void getEvents() {
  64.   static GameEvent *latest = NULL;
  65.  
  66.   if(latest == NULL)
  67.     latest = readEvent();
  68.   if(latest != NULL) {
  69.     while(latest->timestamp < game2->time.current) {
  70.       /* TODO: check if it's safe to ignore the return value here */
  71.       processEvent(latest);
  72.       latest = readEvent();
  73.       if(latest == NULL) return;
  74.     }
  75.   }
  76. }
  77.   
  78. int writeDemoInfo() {
  79.   int i;
  80.   Data *data;
  81.  
  82.   if(game2->record == NULL) {
  83.     fprintf(stderr, "[recording] illegal file handle\n");
  84.     return 1;
  85.   }
  86.   fprintf(game2->record, "Rules: Speed: %f, EraseCrashed: %d\n",
  87.       game2->rules.speed, game2->rules.eraseCrashed);
  88.   fprintf(game2->record, "Players: %d\n", game2->players);
  89.   for(i = 0; i < game2->players; i++) {
  90.     data = game->player[i].data;
  91.     fprintf(game2->record, "x: %d y: %d direction: %d\n",
  92.         data->iposx,
  93.         data->iposy,
  94.         data->dir);
  95.  
  96.   }
  97.   return 0;
  98. }
  99.  
  100. int readDemoInfo() {
  101.   int i;
  102.  
  103.   if(game2->play == NULL) {
  104.     fprintf(stderr, "[playing] illegal file handle\n");
  105.     return 1;
  106.   }
  107.   if(fscanf(game2->play, "Rules: Speed: %f, EraseCrashed: %d ",
  108.         &(game2->rules.speed), &(game2->rules.eraseCrashed)) != 2 ||
  109.      fscanf(game2->play, "Players: %d ", &(game2->players)) != 1)
  110.     return 1;
  111.   game2->startPositions = (int*) malloc(3 * game2->players * sizeof(int));
  112.   for(i = 0; i < game2->players; i++) {
  113.     if(fscanf(game2->play, "x: %d y: %d direction: %d ",
  114.           (game2->startPositions + 3 * i + 0),
  115.           (game2->startPositions + 3 * i + 1),
  116.           (game2->startPositions + 3 * i + 2)) != 3)
  117.       return 1;
  118.   }
  119.   return 0;
  120. }
  121.                                        
  122.     
  123.